# adapter_pattern.py

# 定义ITarget接口
class ITarget:
    def Request(self):
        raise NotImplementedError("Subclasses should implement this!")

    def SpecializedRequest(self):
        raise NotImplementedError("Optional method, may be implemented by subclasses.")


# 定义一个需要适配的类（假设这是已有的、不符合Client需要的接口）
class Adaptee:
    def SpecificRequest(self):
        # 这里是Adaptee类原有的方法，名字与ITarget中的不同
        print("Called SpecificRequest() in Adaptee")


# 适配器类，它继承自ITarget接口，并持有一个Adaptee对象
class Adapter(ITarget):
    def __init__(self):
        self.adaptee = Adaptee()

    def Request(self):
        # 适配器将Adaptee的SpecificRequest方法适配为ITarget的Request方法
        self.adaptee.SpecificRequest()

    # 由于Adapter没有重写SpecializedRequest，它将继承ITarget的默认实现（抛出异常）
    # 如果Client不需要调用SpecializedRequest，则可以不实现这个方法
    def SpecializedRequest(self):
        pass  # 或者直接抛出异常，表示未实现


# 客户端代码
class Client:
    def set_target(self, target: ITarget):
        self.target = target

    def execute_request(self):
        # 客户端代码调用ITarget接口的方法
        self.target.Request()
        # 如果需要，也可以调用SpecializedRequest，但这里要注意适配器是否实现了这个方法
        # self.target.SpecializedRequest()  # 这行代码在运行时如果Adapter没有实现会抛出异常


# 测试代码
if __name__ == "__main__":
    adapter = Adapter()
    client = Client()
    client.set_target(adapter)
    client.execute_request()  # 输出：Called SpecificRequest() in Adaptee